#include <gtest/gtest.h>
#include "Poller/SelectWrap.h"
#include <fcntl.h>
#include <unistd.h>
#include "Util/Util.h"

namespace toolkit {

class FdSetTest : public ::testing::Test {
protected:
    FdSet fdSet;
};

// 测试 FdSet 构造函数
TEST_F(FdSetTest, Constructor) {
    // 简单验证构造后 _ptr 不为空
    EXPECT_NE(fdSet._ptr, nullptr);
}

// 测试 fdZero 方法
TEST_F(FdSetTest, FdZero) {
    fdSet.fdZero();
    // 可根据实际实现添加更多验证逻辑
}

// 测试 fdSet 和 isSet 方法
TEST_F(FdSetTest, FdSetAndIsSet) {
    int testFd = 3;
    fdSet.fdSet(testFd);
    EXPECT_TRUE(fdSet.isSet(testFd));
}

// 测试 fdClr 和 isSet 方法
TEST_F(FdSetTest, FdClrAndIsSet) {
    int testFd = 3;
    fdSet.fdSet(testFd);
    fdSet.fdClr(testFd);
    EXPECT_FALSE(fdSet.isSet(testFd));
}

// 测试 ycSelect 函数
TEST(SelectTest, YcSelect) {
    FdSet readSet, writeSet, errSet;
    struct timeval tv = {0, 1000}; // 1 毫秒超时
    int result = select_wrap(1, &readSet, &writeSet, &errSet, &tv);
    // 由于没有实际有效的文件描述符，可能返回 0 或 -1
    EXPECT_TRUE(result == 0);
    EXPECT_TRUE(result == -1);
}

} // namespace toolkit

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}